/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation
**
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
**     the names of its contributors may be used to endorse or promote
**     products derived from this software without specific prior written
**     permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
** $QT_END_LICENSE$
**
****************************************************************************/


// User Include.
#include "stringrenderer_symbian.h"

/*!
 * -----------------------------------------------------------------------------
 * Append() documented in StringRenderer.h.
 * -----------------------------------------------------------------------------
 */
void Append( const TDesC8 &aSrc, TDes16 &aDst )
    {
    for( TInt i=0; i < aSrc.Length(); i++ )
        {
        aDst.Append(aSrc[i]);
        }
    }

void Append( const TDesC16 &aSrc, TDes16 &aDst )
    {
    aDst.Append( aSrc );
    }
/*!
 * -----------------------------------------------------------------------------
 * RenderAsNumbers() documented in StringRenderer.h.
 * -----------------------------------------------------------------------------
 */

template <class TDESC>
LOCAL_C void RenderAsNumbersTemplated( const TDESC &anArray, TDes16 &aOutput )
    {
    aOutput.Append('{');
    for( TInt i=0; i < anArray.Length(); i++ )
        {
        if( i>0 )
            {
            aOutput.Append(',');
            }
        aOutput.AppendNum( (TInt) anArray[i] );
        }
    aOutput.Append('}');
    }

void RenderAsNumbers( const TDesC8 &anArray, TDes16 &aOutput )
{
    RenderAsNumbersTemplated(anArray, aOutput);
}

void RenderAsNumbers( const TDesC16 &anArray, TDes16 &aOutput )
{
    RenderAsNumbersTemplated(anArray, aOutput);
}

/*!
 * -----------------------------------------------------------------------------
 * Renders contents of 8 or 16 bit descriptor either as numbers or characters.
 * The example result is "Hello" when aRenderFormat == KRenderDefault and
 * {72,101,108,108,111} when aRenderFormat == KRenderContentAsBinary
 * -----------------------------------------------------------------------------
 */
template <class DESC>
LOCAL_C void RenderDescriptorContent( const DESC &aVariable,
                                      TDes16 &aOutput,
                                      TInt aRenderFormat=KRenderDefault )
    {
    if( aRenderFormat & KRenderContentAsBinary )
        { // render as numbers
        RenderAsNumbers( aVariable, aOutput );
        }
    else
        { // render as string
        aOutput.Append('"');
        Append(aVariable, aOutput);
        aOutput.Append('"');
        }
    }
/*!
 * -----------------------------------------------------------------------------
 * RenderObject() documented in StringRenderer.h.
 * -----------------------------------------------------------------------------
 */
_LIT( KTDesCCharacteristicsFormat, "(len=%d)" );
_LIT( KTDesCharacteristicsFormat,  "(len=%d, maxlen=%d)" );

void RenderObject(const TDesC8 &aVariable, TDes16 &aOutput, TInt aRenderFormat)
    {
    RenderDescriptorContent( aVariable, aOutput, aRenderFormat );
    if( aRenderFormat & KRenderCharacteristics )
        {
        aOutput.Append(' ');
        aOutput.AppendFormat( KTDesCCharacteristicsFormat, aVariable.Length() );
        }
    }

void RenderObject(const TDes8 &aVariable, TDes16 &aOutput, TInt aRenderFormat)
    {
    RenderDescriptorContent( aVariable, aOutput, aRenderFormat );
    if( aRenderFormat & KRenderCharacteristics )
        {
        aOutput.Append(' ');
        aOutput.AppendFormat( KTDesCharacteristicsFormat, aVariable.Length(),
            aVariable.MaxLength() );
        }
    }

void RenderObject(const TDesC16 &aVariable, TDes16 &aOutput, TInt aRenderFormat)
    {
    RenderDescriptorContent( aVariable, aOutput, aRenderFormat );
    if( aRenderFormat & KRenderCharacteristics )
        {
        aOutput.Append(' ');
        aOutput.AppendFormat( KTDesCCharacteristicsFormat, aVariable.Length() );
        }
    }

void RenderObject(const TDes16 &aVariable, TDes16 &aOutput, TInt aRenderFormat)
    {
    RenderDescriptorContent( aVariable, aOutput, aRenderFormat );
    if( aRenderFormat & KRenderCharacteristics )
        {
        aOutput.Append(' ');
        aOutput.AppendFormat( KTDesCharacteristicsFormat,
                              aVariable.Length(),
                              aVariable.MaxLength() );
        }
    }

void RenderObject(const TInt &aVariable,
                  TDes16 &aOutput,
                  TInt /*aRenderFormat*/ )
    {
    aOutput.AppendNum( aVariable );
    }

/*!
 * -----------------------------------------------------------------------------
 * RenderHeader() documented in StringRenderer.h.
 * -----------------------------------------------------------------------------
 */
void RenderHeader(const TDesC &aHeader, TDes &aOutput)
    {
    _LIT( KFormat, "\n--- %S ---\n" );
    TInt spaceAvailable = aOutput.MaxLength() - aOutput.Length();
    if( spaceAvailable >=
            aHeader.Length() +
            KFormat().Length()-2 ) // "%S" is replaced with header text
        {
        aOutput.AppendFormat( KFormat, &aHeader );
        }
    }
